package com.aeoj.clientmanagement.enums.userscore;

import lombok.Getter;

/**
 * author: ZSM
 * time: 2025-04-23 13:01
 */
@Getter
public enum RankEnum {
    LEVEL1("LEVEL1", "青铜", 0, 1800),
    LEVEL2("LEVEL2", "白银", 1801, 2400),
    LEVEL3("LEVEL3", "黄金", 2401, 3000),
    LEVEL4("LEVEL4", "钻石", 3001, 3600),
    LEVEL5("LEVEL5", "王者", 3601, Integer.MAX_VALUE);

    private final String code;      // 等级代码(LEVEL1, LEVEL2等)
    private final String name;      // 中文段位名称
    private final long minScore;     // 最低积分
    private final long maxScore;     // 最高积分

    RankEnum(String code, String name, long minScore, long maxScore) {
        this.code = code;
        this.name = name;
        this.minScore = minScore;
        this.maxScore = maxScore;
    }

    /**
     * 根据积分获取对应的段位
     * @param score 用户积分
     * @return 对应的段位枚举
     */
    public static RankEnum getByScore(long score) {
        for (RankEnum rank : values()) {
            if (score >= rank.getMinScore() && score <= rank.getMaxScore()) {
                return rank;
            }
        }
        return LEVEL1; // 默认返回LEVEL1(青铜)
    }

    /**
     * 根据code获取枚举
     * @param code 段位代码(LEVEL1, LEVEL2等)
     * @return 对应的段位枚举
     */
    public static RankEnum getByCode(String code) {
        for (RankEnum rank : values()) {
            if (rank.getCode().equalsIgnoreCase(code)) {
                return rank;
            }
        }
        return LEVEL1; // 默认返回LEVEL1(青铜)
    }

    /**
     * 根据中文名称获取枚举
     * @param name 中文段位名称(青铜、白银等)
     * @return 对应的段位枚举
     */
    public static RankEnum getByName(String name) {
        for (RankEnum rank : values()) {
            if (rank.getName().equals(name)) {
                return rank;
            }
        }
        return LEVEL1; // 默认返回LEVEL1(青铜)
    }

    /**
     * 获取下一个更高段位(用于升级判断)
     * @return 下一个段位，如果没有更高段位则返回null
     */
    public RankEnum getNextRank() {
        int ordinal = this.ordinal();
        if (ordinal < values().length - 1) {
            return values()[ordinal + 1];
        }
        return null;
    }

    /**
     * 检查当前积分是否可以升级到下一个段位
     * @param currentScore 当前积分
     * @return 是否可以升级
     */
    public boolean canUpgrade(long currentScore) {
        RankEnum nextRank = getNextRank();
        return nextRank != null && currentScore >= nextRank.getMinScore();
    }
}
